home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
asm_msc1.arc
/
EX42.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-11-20
|
3KB
|
95 lines
TITLE 32-Bit x 32-Bit Signed Multiply (EX42.ASM)
PAGE ,132
OUR_DATA SEGMENT PARA 'DATA'
HI_MCND DW ?
LO_MCND DW ?
HI_PP1 DW ?
LO_PP1 DW ?
HI_PP2 DW ?
LO_PP2 DW ?
HI_PP3 DW ?
LO_PP3 DW ?
HI_PP4 DW ?
LO_PP4 DW ?
NEG_IND DB ?
OUR_DATA ENDS
OUR_CODE SEGMENT PARA 'CODE'
PUBLIC MULS32
MULS32 PROC FAR
ASSUME CS:OUR_CODE,DS:OUR_DATA
;
; Initialize the data segment address.
;
PUSH DS ;Save caller's DS and DI
PUSH DI
MOV DI,OUR_DATA ;Initialize DS
MOV DS,DI
;
; The main procedure follows.
;
MOV NEG_IND,0 ;Negative indicator = 0
CMP DX,0 ;Multiplicand negative?
JNS CHKCX ; No. Go check multiplier
NOT AX ; Yes. 2s-comp. multiplicand
NOT DX
ADD AX,1
ADC DX,0
NOT NEG_IND ; and 1s-comp. indicator
CHKCX: CMP CX,0 ;Multiplier negative?
JNS GOMUL ; No. Go multiply
NOT BX ; Yes. 2s-comp. multiplier
NOT CX
ADD BX,1
ADC CX,0
NOT NEG_IND ; and 1s-comp. indicator
;
; This is the MULU32 code.
;
GOMUL: MOV HI_MCND,DX ;Save multiplicand in memory
MOV LO_MCND,AX
MUL BX ;Form partial product #1
MOV HI_PP1,DX ; and save it in memory
MOV LO_PP1,AX
MOV AX,HI_MCND ;Form partial product #2
MUL BX
MOV HI_PP2,DX ; and save it in memory
MOV LO_PP2,AX
MOV AX,LO_MCND ;Form partial product #3
MUL CX
MOV HI_PP3,DX ; and save it in memory
MOV LO_PP3,AX
MOV AX,HI_MCND ;Form partial product #4
MUL CX
MOV HI_PP4,DX ; and save it in memory
MOV LO_PP4,AX
MOV AX,LO_PP1 ;Low 16 bits
MOV BX,HI_PP1 ;Form mid-lower 16 bits
ADD BX,LO_PP2 ; with sum #1
ADC HI_PP2,0
ADD BX,LO_PP3 ; and sum #2
MOV CX,HI_PP2 ;Form mid-upper 16 bits
ADC CX,HI_PP3 ; with sum #3
ADC HI_PP4,0
ADD CX,LO_PP4 ; and sum #4
MOV DX,HI_PP4 ;Form high 16 bits
ADC DX,0 ; including propagated carry
;
; End of MULU32 code.
;
CMP NEG_IND,0 ;Does product have right sign?
JZ DONE ; Yes. Exit.
NOT AX ; No. 2s-comp. product
NOT BX
NOT CX
NOT DX
ADD AX,1
ADC BX,0
ADC CX,0
ADC DX,0
DONE: POP DI ;Restore caller's registers
POP DS
RET
MULS32 ENDP
OUR_CODE ENDS
END MULS32